package org.codingq92.pritice.socket.group;

import java.net.Socket;

/**
 * 服务器端接受线程类，用于处理客户端的连接和消息接收
 *
 * @author CodingQ92
 * @date 2025/6/22 21:55
 */
public class ServerAcceptThread extends Thread {
    // 保存与客户端建立的socket连接
    private final Socket socket;

    /**
     * 构造函数，初始化客户端socket
     *
     * @param socket 与客户端的socket连接
     */
    public ServerAcceptThread(Socket socket) {
        this.socket = socket;
    }

    /**
     * 线程运行方法，不断监听客户端消息并群发给所有在线客户端
     */
    public void run() {
        try {
            // 获取socket的输入流，用于接收客户端发送的消息
            java.io.InputStream inputStream = socket.getInputStream();
            java.io.DataInputStream dataInputStream = new java.io.DataInputStream(inputStream);
            while (true) {
                try {
                    // 读取客户端发送的UTF-8编码的消息
                    String msg = dataInputStream.readUTF();
                    System.out.println("收到客户端发来的消息: " + msg);
                    // 将收到的消息开始群组发送
                    sendMsgToGroup(msg);
                } catch (Exception e) {
                    // 当客户端断开连接时，移除对应的socket并关闭，然后跳出循环
                    GroupChatServer.onLineSocket.remove(socket);
                    socket.close();
                    break;
                }
            }
        } catch (Exception e) {
            // 打印异常信息
            e.printStackTrace();
        }
    }

    /**
     * 将消息群发给所有在线客户端
     *
     * @param msg 需要群发的消息
     * @throws Exception 抛出异常
     */
    private void sendMsgToGroup(String msg) throws Exception {
        // 遍历所有在线客户端的socket
        for (Socket cSocket : GroupChatServer.onLineSocket) {
            // 获取socket的输出流，用于发送消息给客户端
            java.io.OutputStream outputStream = cSocket.getOutputStream();
            java.io.DataOutputStream dataOutputStream = new java.io.DataOutputStream(outputStream);
            // 发送UTF-8编码的消息给客户端
            dataOutputStream.writeUTF(msg);
        }
    }
}
